package jp.co.nes.awssupport.business.logic;

import java.time.YearMonth;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;

import jp.co.nes.awssupport.access.dao.DailyCompiledBillingDao;
import jp.co.nes.awssupport.access.utility.IdUtil;
import jp.co.nes.awssupport.business.bean.BillingCsvBean;
import jp.co.nes.awssupport.business.utility.BillingCsvUtil;
import jp.co.nes.awssupport.common.bean.DailyCompiledBillingBean;
import jp.co.nes.awssupport.common.constant.SpotManageFlg;
import jp.co.nes.awssupport.common.utility.DateUtil;

/**
 * 日次集計結果処理です。
 */
public class DailyCompiledBillingProcessing {

    /** 処理対象年月 */
    private YearMonth targetYearMonth;

    /** 連結アカウントID */
    private String linkedAccountId;

    /** 請求CSVリスト */
    private List<BillingCsvBean> csvList = new ArrayList<>();

    /**
     * 処理対象年月を引数にもつコンストラクタです。
     *
     * @param targetYearMonth 処理対象年月
     * @param linkedAccountId 連結アカウントID
     */
    public DailyCompiledBillingProcessing(YearMonth targetYearMonth, String linkedAccountId) {
        this.targetYearMonth = targetYearMonth;
        this.linkedAccountId = linkedAccountId;
    }

    /**
     * 日次集計結果を削除します。
     */
    public void delete() {
        DailyCompiledBillingDao dao = new DailyCompiledBillingDao();
        dao.delete(linkedAccountId, targetYearMonth);
    }

    /**
     * 請求CSVを追加します。
     *
     * @param csvBean 請求CSV
     */
    public void add(BillingCsvBean csvBean) {
        csvList.add(csvBean);
    }

    /**
     * 請求CSVリストをクリアします。
     */
    public void clear() {
        csvList.clear();
    }
    /**
     * 日次集計結果を登録します。
     *
     * @param max バッチ更新の最大数
     */
    public void insert(int max) {
        DailyCompiledBillingDao dao = new DailyCompiledBillingDao();
        dao.insert(toDailyCompiledBillingList(), max);
    }

    /**
     * 日次集計結果リストを返却します。
     *
     * @return 日次集計結果リスト
     */
    protected List<DailyCompiledBillingBean> toDailyCompiledBillingList() {
        return csvList.stream().map(csvBean -> toDailyCompiledBilling(csvBean)).collect(Collectors.toList());
    }

    /**
     * 日次集計結果を返却します。
     *
     * @param csvBean 請求CSV
     * @return 日次集計結果
     */
    private DailyCompiledBillingBean toDailyCompiledBilling(BillingCsvBean csvBean) {
        DailyCompiledBillingBean dcbBean = new DailyCompiledBillingBean();
        dcbBean.setUuid(IdUtil.createUuid());
        dcbBean.setLinkedAccountId(csvBean.getLinkedAccountId());
        dcbBean.setYearMonth(DateUtil.toInt(targetYearMonth));
        dcbBean.setProductName(csvBean.getProductName());
        dcbBean.setUsageType(csvBean.getUsageType());
        dcbBean.setUsageStartDate(csvBean.getUsageStartDate());
        dcbBean.setUsageEndDate(csvBean.getUsageEndDate());
        dcbBean.setResourceId(csvBean.getResourceId());
        dcbBean.setNameTag(csvBean.getNameTag());
        if (BillingCsvUtil.isSpot(csvBean)) {
            dcbBean.setSpotManageFlg(SpotManageFlg.TRUE.toString());
            if (StringUtils.isEmpty(dcbBean.getUsageType())) {
                // スポットで使用タイプが空だった場合は、ハイフンを設定する(DBR版からの仕様)
                dcbBean.setUsageType("-");
            }
        } else {
            dcbBean.setSpotManageFlg(SpotManageFlg.FALSE.toString());
        }
        dcbBean.setRate(csvBean.getRate());
        dcbBean.setUsageQuantity(csvBean.getUsageQuantity());
        dcbBean.setDescription(csvBean.getDescription());
        dcbBean.setUnit(csvBean.getUnit());
        return dcbBean;
    }
}
